import { oops } from "db://oops-framework/core/Oops";
import { smc } from "../../../../common/ecs/SingletonModuleComp";
import { Role } from "../../../../role/Role";
import { Effect } from "../../../scene/model/BattleEnum";
import { BattleType } from "../../../scene/SceneEvent";
import { ISkillReport } from "../../../skill/model/report/ISkillReport";
import { Skill } from "../../../skill/Skill";
import { Buff } from "../../Buff";
import { RoleAttributeType } from "../../../../role/model/RoleEnum";
import { EffectDamage } from "../../../skill/model/report/EffectDamage";
import { EffectBuff } from "../../../skill/model/report/EffectBuff";
import { EffectRecovery } from "../../../scene/model/EffectRecovery";
import { EffectImmune } from "../../../skill/model/report/EffectImmune";
import { EffectShield } from "../../../skill/model/report/EffectShield";
import { BuffIconViewComp } from "../../view/BuffIconViewComp";

/** 状态效果逻辑 */
export class BuffCasting {
    /** 角色身上的BUFF */
    buff: Buff = null!;
    /** 释放buff者的技能效果 */
    effect: Effect = null!;
    /** 角色身上的BUFF的技能 */
    protected get skill(): Skill {
        return this.buff.BuffModel.skill;
    }
    /** 当前技能释放者 */
    protected get caster(): Role {
        return this.buff.BuffModel.caster;
    }
    /** 当前技能受击者 */
    protected get target(): Role {
        return this.buff.BuffModel.target;
    }

    /** 当前正在处理的战报对象 */
    protected isr: ISkillReport = null!;

    /** 生成对指定目标释放技能战报 */
    cast(target: Role) {
        this.isr = {
            caster: this.caster,
            target: target,
            skill: this.skill,
            hits: []
        };
        switch (target.RoleModel.battleType) {
            case BattleType.Scene:
                smc.scene.MapModelRole.reports.push(this.isr);
                break;
            case BattleType.Boss:
              //  smc.boss.BossMapModelRole.reports.push(this.isr);
              console.log("boss 战报 todo")
                break;
            case BattleType.Tower:
                //  smc.tower.TowerMapModelRole.reports.push(this.isr);
                console.log("tower 战报 todo")
                break;
            default:
                break;
        }


        oops.log.trace(`【BUFF】【${this.caster.RoleModel.pos}号位：${this.caster.RoleModel.table.name}】向【${target.RoleModel.pos}号位：${target.RoleModel.table.name}】施放【${this.buff.BuffModel.table.name}】触发`);
    }
    /**
       * 生成技能效果对目标的受击战报
       * @param isr       技能释放战报数据
       * @param target    受击目标角色（目标数据可能与技能选中的目标不一样，例如AOE技能）
       * @param effect    受击的技能效果数据
       * @returns         受击战报
       */
    hit(target: Role, effect: Effect) {
        // 创建一个对象，包含目标和效果
        var srh = { target: target, effect }
        // 将该对象添加到isr.hits数组中
        this.isr.hits.push(srh);

        // 获取isr的技能
        var skill = this.isr.skill;
        // 如果效果是EffectBuff类型
        if (effect instanceof EffectBuff) {
            // 创建一个字符串，包含施放者的位置、名字，目标的职位、名字，以及效果的名称
            var str = `【BUFF】【${this.caster.RoleModel.pos}号位：${this.caster.RoleModel.table.name}】向【${target.RoleModel.pos}号位：${target.RoleModel.table.name}】施放【${effect.buff.BuffModel.table.name}】`;
            // 如果效果的层数大于1，则添加当前层数
            var str_overlying = "";
            if (effect.buff.BuffModel.table.overlying > 1) {
                str_overlying = `当前层数为【${effect.buff.BuffModel.overlying}/${effect.buff.BuffModel.table.overlying}】`;
            }
            // 打印日志
            oops.log.trace(str + str_overlying);
        }
        // 如果效果是EffectDamage类型
        else if (effect instanceof EffectDamage) {
            // 获取目标的当前生命值和最大生命值
            var hp = target.getNumericValue(RoleAttributeType.hp_battle);
            var hp_max = target.hp;
            // 打印日志
            oops.log.trace(`【BUFF】【${this.buff.BuffModel.table.name}】使【${target.RoleModel.pos}号位：${target.RoleModel.table.name}】受到【${effect.value}】点伤害，当前生命状态为【${hp}/${hp_max}】`);
        }
        // 如果效果是EffectRecovery类型
        else if (effect instanceof EffectRecovery) {
            // 获取目标的当前生命值和最大生命值
            var hp = target.getNumericValue(RoleAttributeType.hp_battle);
            var hp_max = target.hp;
            // 打印日志
            oops.log.trace(`【BUFF】【${skill.SkillModel.table.name}】使【${target.RoleModel.pos}号位：${target.RoleModel.table.name}】恢复【${effect.value}】点生命【${hp}/${hp_max}】`);
        }
        // 如果效果是EffectImmune类型
        else if (effect instanceof EffectImmune) {
            // 打印日志
            oops.log.trace(`【BUFF】【${skill.SkillModel.table.name}】使【${target.RoleModel.pos}号位：${target.RoleModel.table.name}】免疫控制`);
        }
        // 如果效果是EffectShield类型
        else if (effect instanceof EffectShield) {
            // 打印日志
            oops.log.trace(`【BUFF】【${skill.SkillModel.table.name}】使【${target.RoleModel.pos}号位：${target.RoleModel.table.name}】添加【${effect.shield}】点护盾值`);
        }
    }

     /** ----------技能事件---------- */

    /** BUFF添加完成时触发 */
    onAdded() {
    }
    /** BUFF覆盖或叠加时触发 */
    onCover() { }
    /** BUFF删除时触发 */
    onRemove() {
        if(this.buff.has(BuffIconViewComp)){
            this.buff.remove(BuffIconViewComp);
        }
    }

    /** ----------攻击类事件---------- */
    /** 主动攻击前 */
    onCastBefore() { }
    /** 攻击后 */
    onCastAfter() { }
    /** 目标受到伤害前（计算无数值未赋值到目标角色时） */
    onHitBefore() { }
    /** 受到伤害后（计算无数值已赋值到目标角色时） */
    onHitAfter() { }
    /** 复活时 */
    onRevive() { }
    /** 自己死亡后 */
    onSelfDie() { }
    /** 队友死亡后 */
    onOtherDie(){ }
    /** 敌方亡后 */
    onEnemyDie(){ }

    /** 行动前 */
    onActionBefore() { }
    /** 行动后 */
    onActionAfter() { }

    /** 战斗开始 */
    onBattleStart() { }
    /** 战斗结束 */
    onBattleEnd() { }
    /** 回合开始 */
    onRoundStart() { }
    /** 回合结束 */
    onRoundEnd() { }
    /** 任何人受击前 */
    onAllHitBefore() { }
    /** 任何人受击后 */
    onAllHitAfter() { }
    /** 战场中有角色死亡事件 */
    onDieBattle() { }
    /** 友方护盾消失 */
    onFriendShieldOver(){ }
    /** 格挡时 */
    onBlock(){ }
}